package com.ruoyi.framework.config;

import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
/**
 * @author TsingYu
 * @version 1.0
 * @date 2025/11/21 09:36
 */
public class MonthTableNameHandler implements TableNameHandler {
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMM");

    // private Long mod;

    //使用ThreadLocal防止多线程相互影响
    private static ThreadLocal<Long> tagTime = new ThreadLocal<>();


    public static void setTagTime(Long tagTimeV) {
        tagTime.set(tagTimeV);
    }


    // public MonthTableNameHandler(Long modV) {
    //     this.mod = modV;
    // }




    // 存储表名和对应的动态表名规则
    private final Map<String, String> tableNameRules = new HashMap<>();

    public MonthTableNameHandler() {
        // 初始化需要动态处理的表名规则
        tableNameRules.put("v9_hour_e", "v9_hour_e%s");
    }

    @Override
    public String dynamicTableName(String sql, String tableName) {
        if (tableNameRules.containsKey(tableName)) {
            // 获取当前月份，如 202308
            // String monthSuffix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
            // String format = String.format(tableNameRules.get(tableName), monthSuffix);
            // return String.format(tableNameRules.get(tableName), monthSuffix);

            Long idValue = tagTime.get();
            if (idValue == null) {
                throw new RuntimeException("请设置tagTime值");
            } else {
                LocalDate tagDate = Instant.ofEpochSecond(tagTime.get()).atZone(ZoneId.of("+8")).toLocalDate();
                String suffix = tagDate.format(DateTimeFormatter.ofPattern("yyyyMM"));
                //这里清除ThreadLocal的值，防止线程复用出现问题
                tagTime.set(null);
                return tableName  + suffix;
            }
        }
        return tableName; // 不处理的表名原样返回
    }


    // @Override
    // public String dynamicTableName(String sql, String tableName) {
    //     return "";
    // }

    /**
     * 动态生成物理表名
     *
     * @param logicTableName 逻辑表名（@TableName 中指定的 "user"）
     * @param metaObject     MyBatis 元对象（可获取实体类字段值）
     * @return 物理表名（如 user_202501）
     */
    // @Override
    // public String dynamicTableName(String logicTableName, MetaObject metaObject) {
    //     // 1. 从元对象中获取分表字段（create_time）的值
    //     LocalDateTime createTime = (LocalDateTime) metaObject.getValue("createTime");
    //
    //     // 2. 校验时间戳字段（避免 null 导致分表失败）
    //     if (createTime == null) {
    //         // 若未设置 create_time（如查询时未传入），可默认当前月份或抛出异常
    //         createTime = LocalDateTime.now(); // 此处默认当前月份，根据业务调整
    //     }
    //
    //     // 3. 格式化时间戳，生成分表后缀（如 2025-01-15 → 202501）
    //     String tableSuffix = createTime.format(FORMATTER);
    //
    //     // 4. 拼接物理表名（逻辑表名 + 后缀）
    //     return logicTableName + "_" + tableSuffix;
    // }
}
